/* Filename: 3-信号.c
 * Description:
 * Last modified: humble 2020-11-05 22:59:10
 * $ gcc -Wall 3-信号.c -o 3-信号 -levent
 */
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <event.h>

static int signal_count = 0;

void signal_handle(evutil_socket_t fd, short events, void *arg)
{
    struct event *ev = (struct event *)arg;
    printf("收到信号 %d\n", fd); //evutil_socket_t 是整型，这里用fd代表信号
    signal_count++;
    if (signal_count >= 2) {
        //把事件从集合中删除
        event_del(ev);
    }
}

int main(int argc, char **argv)
{
    if(argc != 1){ fprintf(stderr, "argc !=1"); exit(1); }

    //初始化事件集合
#if 0
    event_init();
#else
    //或者用event_base_new();那就需要接收返回值并且自己free
    struct event_base *base = event_base_new();
#endif

    //创建事件
    struct event ev;

    //初始化事件（把signal和ev绑定）
#if 0
    /* 用event_set() */
    //EV_PERSIST:发生事件时依然保留关心的事件，不用重新布置关心的事件
    event_set(&ev, fd, EV_READ | EV_PERSIST, fifo_read, NULL);
#else
    /* 用event_assign() 比event_set()多了一个参数base */
    event_assign(&ev, base, SIGINT, EV_SIGNAL | EV_PERSIST, signal_handle, &ev);
#endif

    //把事件添加到集合中
    event_add(&ev, NULL);

    //开始监听//死循环监听 如果集合中没有事件可以监听，则返回
#if 0
    event_dispatch();
#else
    event_base_dispatch(base);
#endif

    //释放集合
    event_base_free(base);
    return 0;
}
